const fs = require('fs');
const path = require('path');

// 配置
const SIZE_THRESHOLD = 100; // KB，超过此大小的图片将被推荐移至云存储
const IMAGES_DIR = 'miniprogram/images';
const EXCLUDE_DIRS = ['tabbar', 'icons']; // 不处理这些目录，因为它们是UI必需的

// 用于保存结果的目录
const CLOUD_IMAGES_DIR = 'cloud_images';
if (!fs.existsSync(CLOUD_IMAGES_DIR)) {
  fs.mkdirSync(CLOUD_IMAGES_DIR);
}

// 获取文件大小（KB）
function getFileSizeInKB(filePath) {
  if (fs.existsSync(filePath)) {
    const stats = fs.statSync(filePath);
    return stats.size / 1024;
  }
  return 0;
}

// 递归扫描目录
function scanDirectory(dir) {
  const results = [];
  
  // 检查目录是否存在
  if (!fs.existsSync(dir)) {
    console.log(`目录不存在: ${dir}`);
    return results;
  }
  
  // 读取目录内容
  const entries = fs.readdirSync(dir, { withFileTypes: true });
  
  // 处理每个条目
  for (const entry of entries) {
    const fullPath = path.join(dir, entry.name);
    
    if (entry.isDirectory()) {
      // 跳过排除的目录
      const dirName = entry.name.toLowerCase();
      if (EXCLUDE_DIRS.includes(dirName)) {
        console.log(`跳过排除的目录: ${fullPath}`);
        continue;
      }
      
      // 递归处理子目录
      const subResults = scanDirectory(fullPath);
      results.push(...subResults);
    } else if (entry.isFile()) {
      // 检查是否是图片文件
      const ext = path.extname(entry.name).toLowerCase();
      if (['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'].includes(ext)) {
        const size = getFileSizeInKB(fullPath);
        
        // 如果图片超过阈值大小，加入结果
        if (size > SIZE_THRESHOLD) {
          results.push({
            path: fullPath,
            name: entry.name,
            size,
            relativePath: fullPath.replace(/\\/g, '/') // 使用正斜杠表示路径
          });
        }
      }
    }
  }
  
  return results;
}

// 生成云存储参考代码
function generateCloudCode(largeImages) {
  const cloudCodePath = path.join(CLOUD_IMAGES_DIR, 'cloud_storage_guide.js');
  
  let code = `// 云开发图片引用指南
// 此文件生成于 ${new Date().toLocaleString()}

// 请按照以下步骤操作:
// 1. 上传以下图片到云开发存储
// 2. 获取图片的fileID
// 3. 替换相应的图片引用

// 图片列表和替换示例:
const cloudImages = {
`;

  // 添加每个图片的信息
  largeImages.forEach(img => {
    const fileID = `cloud://smart-nutritionist.736d-smart-nutritionist-1234567/${img.name}`;
    code += `  '${img.relativePath}': '${fileID}', // ${img.size.toFixed(2)}KB\n`;
  });
  
  code += `};

// 使用示例:

// 1. 初始化云环境
// wx.cloud.init({
//   env: 'smart-nutritionist' // 替换为您的云环境ID
// });

// 2. 获取临时访问URL (适用于页面加载时)
function getImageUrl(localPath) {
  const fileID = cloudImages[localPath];
  if (!fileID) return localPath; // 如果没有对应的云存储路径，返回本地路径
  
  return new Promise((resolve, reject) => {
    wx.cloud.getTempFileURL({
      fileList: [fileID],
      success: res => {
        if (res.fileList && res.fileList[0] && res.fileList[0].tempFileURL) {
          resolve(res.fileList[0].tempFileURL);
        } else {
          console.error('获取云存储URL失败:', res);
          resolve(localPath); // 失败时使用本地路径
        }
      },
      fail: err => {
        console.error('获取云存储URL失败:', err);
        resolve(localPath); // 失败时使用本地路径
      }
    });
  });
}

// 3. 在页面中使用
// Page({
//   data: {
//     imageUrl: '' // 初始为空
//   },
//   
//   onLoad: function() {
//     const localPath = 'miniprogram/images/news/example.jpg';
//     
//     getImageUrl(localPath).then(url => {
//       this.setData({
//         imageUrl: url
//       });
//     });
//   }
// });

// 4. 在WXML中引用
// <image src="{{imageUrl}}" mode="aspectFill"></image>
`;

  // 保存到文件
  fs.writeFileSync(cloudCodePath, code, 'utf8');
  console.log(`云存储引用指南已保存到: ${cloudCodePath}`);
}

// 复制大图片到云存储准备目录
function copyImagesToCloudDir(largeImages) {
  largeImages.forEach(img => {
    const destPath = path.join(CLOUD_IMAGES_DIR, img.name);
    fs.copyFileSync(img.path, destPath);
    console.log(`已复制 ${img.path} 到 ${destPath}`);
  });
}

// 主函数
function main() {
  console.log(`开始扫描大于 ${SIZE_THRESHOLD}KB 的图片...`);
  
  // 扫描图片目录
  const largeImages = scanDirectory(IMAGES_DIR);
  
  // 按大小排序
  largeImages.sort((a, b) => b.size - a.size);
  
  console.log(`\n找到 ${largeImages.length} 个大于 ${SIZE_THRESHOLD}KB 的图片:`);
  
  let totalSize = 0;
  largeImages.forEach((img, index) => {
    totalSize += img.size;
    console.log(`${index + 1}. ${img.relativePath} (${img.size.toFixed(2)}KB)`);
  });
  
  console.log(`\n总大小: ${totalSize.toFixed(2)}KB (${(totalSize / 1024).toFixed(2)}MB)`);
  console.log(`将这些图片移至云存储可以减少主包约 ${(totalSize / 1024).toFixed(2)}MB`);
  
  // 创建结果目录
  if (!fs.existsSync(CLOUD_IMAGES_DIR)) {
    fs.mkdirSync(CLOUD_IMAGES_DIR);
  }
  
  // 复制图片到云存储准备目录
  copyImagesToCloudDir(largeImages);
  
  // 生成云存储引用代码
  generateCloudCode(largeImages);
  
  console.log('\n处理完成!');
  console.log(`1. 请查看 ${CLOUD_IMAGES_DIR} 目录中的图片`);
  console.log(`2. 将这些图片上传到云存储`);
  console.log(`3. 参考 ${CLOUD_IMAGES_DIR}/cloud_storage_guide.js 文件的指南替换图片引用`);
}

// 执行主函数
main(); 